/********************************************************************************************************************************
 * 《C ++ Primer》第五版中文版，读书笔记：按照书中的的示例源码和每一个小章节的课后习题，自己动手写代码实现，作为联系和测试。
 * Date: 2024-04-03 10:08
 * Author: dimon.chen 
 * EMali: 1181302388@qq.com 
 * 
 * 章节: 第三章 字符串，向量和数组
 *       3.5 C++内置类型数组
 * 
 ********************************************************************************************************************************/


#include <iostream>
#include <vector>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

const int txt_size(void){
	int num = 5;

	return 5;
}


// 放在函数体外部声明，
// 编译器会在编译时检查是否为常量表达式，所以会报错
//

constexpr unsigned buf_size = 1024;		//常量表达式
int ia[buf_size];						//按照《C++ Primer》中的分析是不合法的，但是实际上GNU C++编译器可以编译通过
int ib[4*7 - 14];						//正确是常量表达式
//int ic[txt_size()];					//错误：不是常量表达式。按照《C++ Primer》中的分析是不合法的，但是实际上GNU C++编译器可以编译通过
char st[12] = "01234567890";			//错误：虽然字符串字面值"01234567890"有11个字符，但是还有一个空字符
										// st的长度至少应为11 + 1


string sa2[10];						//执行默认标准库类型string默认初始化，数组中存放10个空string对象
int ie2[10];						//ie2为数组，数组长度为10，存放的为int型，定义在函数体外时，int型等内置算术类型初始化为0

int main(int argc, char *argv[])
{
	///
	/// 3.5.1 节练习
	/// 练习3.27：假设 txt_size 是一个无参数的函数，它的返回值是int，请问下面哪个定义是非法的为什么
	///
	

	// 放在函数体内部声明，
	// 编译器可以编译通过
	//

	unsigned buf_size = 1024;		//不是常量表达式
	int ia[buf_size];				//按照《C++ Primer》中的分析是不合法的，但是实际上GNU C++编译器可以编译通过
	int ib[4*7 - 14];				//正确是常量表达式
	int ic[txt_size()];				//错误：不是常量表达式。按照《C++ Primer》中的分析是不合法的，但是实际上GNU C++编译器可以编译通过
	char st[12] = "01234567890";	//错误：虽然字符串字面值"01234567890"有11个字符，但是还有一个空字符
									// st的长度至少应为11 + 1
	
	///
	/// 3.5.1 节练习
	/// 练习3.28：下面数组中元素的值是什么
	///

	string sa[10];					//执行默认初始化，数组sa的长度是10，数组的元素都相同为空字符串
	int ie[10];						//数组ie中存放的类型是int，int是C++内置数据类型，当内助数据定义在函数体内时，其默认值未知


	cout << "ie" << endl;
	for(auto i : ie)
		cout << i << " ";
	cout << endl;

	cout << "sa" << endl;
	for(auto i : sa)
		cout << i << " ";
	cout << endl;


	cout << "ie2" << endl;
	for(auto i : ie2)
		cout << i << " ";
	cout << endl;

	cout << "sa2" << endl;
	for(auto i : sa2)
		cout << i << " ";
	cout << endl;


	///
	/// 3.5.1 节练习
	/// 练习3.29：相比于vector来说，数组有哪些缺点，请列举出来
	///
	/// 标注库类型表示对象的结合，其中所有对象的类型都相同，集合中的每一个对象都有一个与其对应的索引，可以使用索引值来访问对应的对象
	/// 标准库类型 vector 是类模版而非类型，由vector定义的类型必须包含它元素的类型，例如 vector<int>, vector<string>
	/// 库类型 vector 可以在运行时高效的增长，插入元素
	///
	/// 数组的大小数固定的，必须在声明定义时指定数组的大小，数组定义之后其大小就不能再发生改变。




	///
	/// 3.5.2 节练习
	/// 练习3.30：指出下面代码中的索引错误
	///

	//错误：数组下标的范围从0开始到，数组的大小-1，而不是从1开始到size
	constexpr size_t array_size = 10;
	int ia[array_size];
	for(size_t idx = 1; idx <= array_size; idx++)
		ia[idx] = idx;
	


}

